Fix (de)miniaturizing transient windows, by (un)setting the parent before
authorRichard Hult <richard@imendio.com>
Fri, 6 Jul 2007 19:49:42 +0000 (19:49 +0000)
committerRichard Hult <rhult@src.gnome.org>
Fri, 6 Jul 2007 19:49:42 +0000 (19:49 +0000)
2007-07-06  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkprivate-quartz.h:
* gdk/quartz/gdkwindow-quartz.c:
* gdk/quartz/GdkQuartzWindow.c: Fix (de)miniaturizing transient
windows, by (un)setting the parent before and after miniaturizing.

svn path=/trunk/; revision=18388

ChangeLog
gdk/quartz/GdkQuartzWindow.c
gdk/quartz/gdkprivate-quartz.h
gdk/quartz/gdkwindow-quartz.c

index 8710a9953337eee089e2e00de94d4493f00974c2..5888cf06712077c93426bb5de099e1c6f63bfd10 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-06  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkprivate-quartz.h:
+       * gdk/quartz/gdkwindow-quartz.c:
+       * gdk/quartz/GdkQuartzWindow.c: Fix (de)miniaturizing transient
+       windows, by (un)setting the parent before and after miniaturizing.
+
 2007-07-06  Richard Hult  <richard@imendio.com>
 
        * gdk/quartz/gdkkeys-quartz.c (gdk_keymap_have_bidi_layouts): Add
index d86c21ddd290243089d7fa516bc45676721edb3f..0ffefc5d6c0c4f810fc686d37fb951b3c2778b85 100644 (file)
   return NO;
 }
 
+-(void)windowWillMiniaturize:(NSNotification *)aNotification
+{
+  GdkWindow *window = [[self contentView] gdkWindow];
+
+  _gdk_quartz_window_detach_from_parent (window);
+}
+
 -(void)windowDidMiniaturize:(NSNotification *)aNotification
 {
   GdkWindow *window = [[self contentView] gdkWindow];
@@ -51,6 +58,8 @@
 {
   GdkWindow *window = [[self contentView] gdkWindow];
 
+  _gdk_quartz_window_attach_to_parent (window);
+
   gdk_synthesize_window_state (window, GDK_WINDOW_STATE_ICONIFIED, 0);
 }
 
index aebc1b4de4df57a4acdd95d43249a1004dc14e46..b201ca7a4db7c872b913cc3e116b85a22a496d9e 100644 (file)
@@ -138,6 +138,9 @@ gint       _gdk_quartz_window_get_inverted_screen_y (gint       y);
 GdkWindow *_gdk_quartz_window_find_child            (GdkWindow *window,
                                                     gint       x,
                                                     gint       y);
+void       _gdk_quartz_window_attach_to_parent      (GdkWindow *window);
+void       _gdk_quartz_window_detach_from_parent    (GdkWindow *window);
+
 
 /* Events */
 void         _gdk_quartz_events_update_focus_window   (GdkWindow *new_window,
index 0ab71281b104222c66b7722f3ce2ddd12ff08bb2..e7ab47868b0565c5f7e854237de423c17dd83357 100644 (file)
@@ -834,15 +834,54 @@ show_window_internal (GdkWindow *window,
   if (private->state & GDK_WINDOW_STATE_ICONIFIED)
     gdk_window_iconify (window);
 
+  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
+    _gdk_quartz_window_attach_to_parent (window);
+
+  GDK_QUARTZ_RELEASE_POOL;
+}
+
+/* Temporarily unsets the parent window, if the window is a
+ * transient. 
+ */
+void
+_gdk_quartz_window_detach_from_parent (GdkWindow *window)
+{
+  GdkWindowImplQuartz *impl;
+
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  
+  g_return_if_fail (impl->toplevel != NULL);
+
   if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
     {
       GdkWindowImplQuartz *parent_impl;
 
       parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
-      [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
+      [parent_impl->toplevel removeChildWindow:impl->toplevel];
     }
+}
 
-  GDK_QUARTZ_RELEASE_POOL;
+/* Re-sets the parent window, if the window is a transient. */
+void
+_gdk_quartz_window_attach_to_parent (GdkWindow *window)
+{
+  GdkWindowImplQuartz *impl;
+
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  
+  g_return_if_fail (impl->toplevel != NULL);
+
+  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
+    {
+      GdkWindowImplQuartz *parent_impl;
+
+      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
+      [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
+    }
 }
 
 void
@@ -883,19 +922,8 @@ gdk_window_hide (GdkWindow *window)
 
   if (impl->toplevel) 
     {
-      /* We must unset the transient while it is hidden, otherwise
-       * quartz won't hide the window.
-       */
       if (impl->transient_for)
-        {
-          if (!GDK_WINDOW_DESTROYED (impl->transient_for))
-            {
-              GdkWindowImplQuartz *parent_impl;
-
-              parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
-              [parent_impl->toplevel removeChildWindow:impl->toplevel];
-            }
-        }
+        _gdk_quartz_window_detach_from_parent (window);
 
       [impl->toplevel orderOut:nil];
     }
@@ -955,7 +983,6 @@ move_resize_window_internal (GdkWindow *window,
       NSRect frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
       
       frame_rect.origin.y -= frame_rect.size.height;
-
       [impl->toplevel setFrame:frame_rect display:YES];
     }
   else 
@@ -1563,11 +1590,7 @@ gdk_window_set_transient_for (GdkWindow *window,
 
   if (window_impl->transient_for)
     {
-      if (!GDK_WINDOW_DESTROYED (window_impl->transient_for))
-        {
-          parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window_impl->transient_for)->impl);
-          [parent_impl->toplevel removeChildWindow:window_impl->toplevel];
-        }
+      _gdk_quartz_window_detach_from_parent (window);
 
       g_object_unref (window_impl->transient_for);
       window_impl->transient_for = NULL;
@@ -1594,7 +1617,7 @@ gdk_window_set_transient_for (GdkWindow *window,
            * window will be added in show() instead.
            */
           if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
-            [parent_impl->toplevel addChildWindow:window_impl->toplevel ordered:NSWindowAbove];
+            _gdk_quartz_window_attach_to_parent (window);
         }
     }